perm filename FASDFS.MID[1,3] blob sn#293537 filedate 1980-03-02 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00012 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002
C00006 00003
C00010 00004
C00012 00005
C00014 00006
C00017 00007
C00021 00008
C00023 00009
C00028 00010
C00032 00011
C00041 00012
C00043 ENDMK
C⊗;

;;;   **************************************************************
;;;   ***** MACLISP ****** STANDARD AC, UUO, AND MACRO DEFINITIONS *
;;;   **************************************************************
;;;   ** (C) COPYRIGHT 1976 MASSACHUSETTS INSTITUTE OF TECHNOLOGY **
;;;   ****** THIS IS A READ-ONLY FILE! (ALL WRITES RESERVED) *******
;;;   **************************************************************


;;; THIS FILE CONTAINS:
;;;	STANDARD SYMBOLIC ACCUMULATOR DEFINITIONS.
;;;	UUO DEFINITIONS:
;;;		ERROR CALLS AND STRING TYPEOUT.
;;;		COMPILED CODE TO INTERPRETER INTERFACES.
;;;		VARIOUS UUOS USEFUL FROM DDT.
;;;	.GLOBAL DECLARATIONS.
;;;	.FORMAT DECLARATIONS.
;;;	GENERAL MACRO DEFINITIONS [THAT ANY LOSER MIGHT WANT].
;;;	SYMBOLIC NAMES RELATED TO ARRAYS.
;;;	SYMBOLIC NAMES RELATED TO FILES.

;;; THE DEFINITIONS FOR MACLISP CONTAINED HEREIN
;;; ARE RELATIVELY STABLE. THIS FILE MAY BE .INSRT'D BY MIDAS
;;; FILES ASSEMBLED IN .FASL MODE TO DEFINE THESE THINGS.
;;; THE .GLOBAL DECLARATIONS IN PARTICULAR ARE FOR THE
;;; BENEFIT OF THESE .FASL FILES.
;;; IT IS A GOOD IDEA FOR .FASL FILES TO USE THE FASEND MACRO
;;; IN PLACE OF THE USUAL END STATEMENT.

SUBTTL	ACCUMULATOR USAGE

NIL=0		;ATOM HEADER FOR NIL
A=1		;ARG 1; VALUE; MARKED FROM BY GC
B=2		;ARG 2; MARKED FROM BY GC
C=3		;ARG 3; MARKED FROM BY GC
AR1=4		;ARG 4; MARKED FROM BY GC
AR2A=5		;ARG 5; MARKED FROM BY GC
NACS==5	;NUMBER OF ACS MARKED FROM BY GC - NO OTHER ACS MARKED
T=6		;-<NO. OF ARGS> FOR LSUBR CALL; ALSO USED FOR JSP T,
TT=7		;TEMP; OFTEN USED FOR ARGS TO INTERNAL ROUTINES
D=10		;SOMEWHAT LESS TEMPORARY THAN TT
R=11		;DITTO; SOMETIMES USED FOR JSP R,
F=12		;SOMEWHAT LESS TEMPORARY THAN D AND R
FREEAC=13	;UNUSED BY LISP, EXCEPT SAVED-USED-RESTORED BY GC
P=14		;SUBROUTINE AND SYSTEM PDL POINTER ("REGULAR PDL")
FLP=15		;FLONUM PDL POINTER ("FLOPDL")
FXP=16		;FIXNUM PDL POINTER ("FIXPDL")
SP=17		;LAMBDA-BINDINGS PDL POINTER ("SPECIAL PDL")
;;; PDL POINTERS ARE ALWAYS KEPT IN ACS. PDL POINTERS ARE NOT
;;; MARKED FROM, BUT PDL DATA ON REGULAR AND SPECIAL PDLS ARE
;;; PROTECTED FROM GARBAGE COLLECTION.
;;; FLP IS NOT USED BY LISP, EXCEPT AT LDATFL AND ERRIOJ,
;;; BUT PRIMARILY BY COMPILED NUMERICAL CODE.
;;; DO NOT DO RANDOM PUSH/POPS ON SP - USE BIND AND UNBIND ROUTINES.

;;; A FEW RANDOMLY USEFUL DEFINITIONS TO KEEP THINGS SYMBOLIC
;;; BUT WATCH OUT!  DONT JUST RANDOMLY THINK YOU CAN CHANGE NASCII 
;;;	AND HAVE THINGS WIN, ESPECIALLY THE PACKING OF CHARS FOR 
;;;	PNAMES, AND THE SPECIAL OBARRAY ENTRIES FOR SCOS.


NASCII==200	;NUMBER OF ASCII CHARS
BYTSWD==5	;NUMBER OF ASCII BYTES PER WORD


SUBTTL	TABLE OF GLOBAL SYMBOLS USED BY COMPILED FUNCTIONS

DEFINE GLBSYM B
IRP A,,[.SET,.MAP,PRINTA,SPECBIND,UNBIND,IOGBND,.LCALL
.UDT,ARGLOC,INUM,ST,FXNV1,PDLNMK,PDLNKJ,FIX1A
FIX1,FLOAT1,IFIX,IFLOAT,FXCONS,FLCONS,ERSETUP,ERUNDO
GOBRK,CARCDR,.STORE,NPUSH,PA3,QUNBOUND,FLTSKP,FXNV2
FXNV3,FXNV4,FIX2,FLOAT2,AREGET]
	B
TERMIN
IFE QIO,[IRP A,,[UINITA,UTIN]
		B
	 TERMIN
	]
IFN QIO,[IRP A,,[INTREL,INTREL]
		B
	 TERMIN
	]
IRP A,,[INTREL,INHIBIT,NOQUIT,CHECKI,0PUSH,0.0PUSH,NILPROPS,VBIND,%CXR,%RPX]
	B
TERMIN
TERMIN

DEFINE SIXSYM B			;SIXBIT NAMES -- MUST MATCH GLBSYM
IRP A,,[*SET,*MAP,PRINTA,SPECBIND,UNBIND,IOGBND,*LCALL
*UDT,ARGLOC,INUM,NUMVAL,FXNV1,PDLNMK,PDLNKJ,FIX1A
FIX1,FLOAT1,IFIX,IFLOAT,FXCONS,FLCONS,ERSETUP,ERUNDO
GOBRK,CARCDR,*STORE,NPUSH,PA3,MAKUNBOUND,FLTSKP,FXNV2
FXNV3,FXNV4,FIX2,FLOAT2,AREGET]
	B
TERMIN
IFE QIO,[IRP A,,[UINITA,UTIN]
		B
	 TERMIN
	]
IFN QIO,[IRP A,,[INTREL,INTREL]
		B
	 TERMIN
	]
IRP A,,[INTREL,INHIBIT,NOQUIT,CHECKI,0PUSH,0*0PUSH,NILPROPS,VBIND,%CXR,%RPX]
	B
TERMIN
TERMIN

;;; ADDITIONAL SYMBOLS FOR LAP AND .FASL HACKERS

DEFINE XTRSYM B
IFN ITS,[
IRP A,,[GETCOR,RINTERN]
	B
TERMIN
]	;END OF IFN ITS
IFN BIGNUM,[
IRP A,,[BNCONS,NVSKIP]
	B
TERMIN
]	;END OF IFN BIGNUM
IRP A,,[CPOPJ,CCPOPJ,POPAJ,POP1J,CINTREL,LWNACK,SIXMAK,SQUEEZE]
	B
TERMIN
IFN QIO,[
IRP A,,[ALFILE,ALCHAN,XFILEP,FIL6BT,6BTNML,SIXATM,READ0A]
	B
TERMIN
]		;END OF IFN QIO
IFN JOBQIO,[
IRP A,,[JOBTB,LOJOBA]
	B
TERMIN
]		;END OF IFN JOBQIO
TERMIN

;;; SYMBOLS FOR COMPILED CODE

IFNDEF ITS, ITS==1
IFNDEF BIGNUM, BIGNUM==1
IFNDEF QIO, QIO==1
IFNDEF JOBQIO, JOBQIO==1

GLBSYM [.GLOBAL A]
XTRSYM [.GLOBAL A]

SUBTTL	SYMBOLS FOR NUMBER-OF-ARGS CHECKING, AND .FORMAT


;;; SYMBOLS TO BE USED WITH FWNACK AND LWNACK.
;;; ORDINARILY ONE WRITES
;;;		JSP TT,FWNACK
;;;		FAXXX,,QZZZZZ
;;; IN EACH SYMBOL, THE 3.1 BIT (THESE ARE LEFT-HALF SYMBOLS)
;;; MEANS FSUBR. THE 3.2 BIT MEANS 0 ARGS IS OKAY; 3.3, 1 ARG;
;;; 3.4, 2 ARGS; ... ; 4.8, 15. ARGS; 4.9, > 15. ARGS.

;;; ITEMS IN THIS IRP MUST HAVE FIRST FOUR CHARS UNIQUE!!!
;;; IF YOU ADD STUFF HERE, ALSO FIX UP FASEND.

IRP X,,[02,1N,12,23,2N,0,1,2,4,01,012,01234,0234,3456,1234567
13456,234,345,234567,76543]
LA!X==0
IRPC Q,,[X]
IFSN Q,N, LA!X==LA!X+2←Q
.ALSO	ZZ==Q
.ELSE	LA!X==LA!X+<<777774←ZZ>&7777777>
TERMIN
FA!X==LA!X+1
TERMIN




;;; THE FOLLOWING FORMATS ARE HEREBY DECLARED ILLEGAL AS
;;; BEING REDUNDANT AND/OR GROSSLY CONFUSING.
;;; SEE THE MIDAS MANUAL FOR DETAILS.
;;;		,A
;;;		,A C
;;;		,A,
;;;		,A,C
;;;		A B C
;;;		A,
;;;		A,B
;;;		A,B C
;;;		A,B,
;;;		A,B,C

IRP X,,[14,15,16,17,25,30,34,35,36,37]
.FORMAT X,0
TERMIN

%SY==1,,537777		;FLAG BITS FOR SQUOZE SYMBOLS IN DDT
%SYHKL==400000	;HALF KILLED
%SYKIL==200000	;FULLY KILLED
%SYLCL==100000	;LOCAL
%SYGBL==40000	;GLOBAL

SUBTTL	GENERAL MACROS

DEFINE CONC A,B			;HAIRY CONCATENATOR MACRO
A!B!TERMIN

DEFINE %			;THIS IS GOOD FOR LIST STRUCTURE
,,.+1!TERMIN

DEFINE LOCKI			;LOCK OUT USER INTERRUPTS UNTIL UNLOCKI'D
	PUSH FXP,INHIBIT
	SETOM INHIBIT
TERMIN

DEFINE UNLOCKI			;RELEASE THE USER-INTERRUPT LOCK, AND CHECK TO SEE 
	PUSHJ P,INTREL		;IF ANY INTERRUPTS WERE STACKED UP WHILE IN LOCKED STATE
TERMIN

DEFINE LOCKTOPOPJ		;LOCK ALL THE ENSUING CODE UNTIL THE
	PUSH P,CINTREL		;EXITING POPJ P,
	LOCKI
TERMIN

DEFINE UNLKPOPJ			;UNLOCK, THEN POPJ P,
	JRST INTREL
TERMIN

IRP PL,,[,FX]
DEFINE SAVE!PL AL/	;CALLED LIKE SAVE A B C
IRPS AC,,AL
	PUSH PL!P,AC
TERMIN
TERMIN
DEFINE RSTR!PL AL/	;CALLED LIKE RSTR C B A
IRPS AC,,AL
	POP PL!P,AC
TERMIN
TERMIN
TERMIN


DEFINE MACROLOOP COUNT,NAME,C		;FOR EXPANDING MANY MACROS
IFSN C,, .CRFOFF
REPEAT COUNT,[ CONC NAME,\.RPCNT
]
IFSN C,, .CRFON
TERMIN

IF1,[

;;; FEATURE SO THAT HAIRY SUMS OF BITS MAY BE WRITTEN NICELY.
;;;	BITMAC FOO,FOO.
;;; CAUSES THE FORM
;;;	FOO<A+B+C>
;;; TO EXPAND INTO THE FORM
;;;	FOO.A+FOO.B+FOO.C

NBITMACS==0

DEFINE BITMAC XX,YY,ZZ=[1,,525252]
DEFINE XX<BITS>
IRPS J,K,[BITS]
YY!!J!K!TERMIN TERMIN
BITMA1 XX,YY,[ZZ]\NBITMACS
NBITMACS==NBITMACS+1
TERMIN

DEFINE BITMA1 XX,YY,ZZ,NN
DEFINE BTMC!NN
EXPUNGE XX,YY
XX==ZZ
YY==ZZ
IFSN [ZZ], IFGE <.TYPE ZZ>, EXPUNGE ZZ
TERMIN
TERMIN

IRP FOO,,[%TB,%TI,%TJ,%TX,%TO,%TS,%TC,%TG,%TT,%PI,%PJ]
IFDEF FOO, SV$!FOO==FOO		.SEE BITMAC
.ELSE SV$!FOO==1,,525252
EXPUNGE FOO
TERMIN

BITMAC AS,AS.			;LH ASARS
BITMAC TTS,TTS.			;LH TTSARS
BITMAC FBT,FBT.			;LH F.MODE WORD IN FILE ARRAYS
BITMAC RS.,RS.			;FOR READER SYNTAX BITS
BITMAC RS%,RS%,525252		;READER SYNTAX BITS, LH SHIFTED INTO RH
BITMAC IB,IB.,[525252,,525252]	;WORD 1 INTERRUPT BITS
BITMAC %TB,%TB,SV$%TB		;LH .TTY USER VARIABLE
BITMAC %TI,%TI,SV$%TI		;LH TTY IOCHNM BITS (SOME PER-IOT)
BITMAC %TJ,%TJ,SV$%TJ
BITMAC %TX,%TX,SV$%TX		;RH TTY CHARACTER BITS
BITMAC %TO,%TO,SV$%TO		;LH TTYOPT VARIABLE
BITMAC %TS,%TS,SV$%TS		;LH TTYSTS VARIABLE
BITMAC %TC,%TC,SV$%TC		;LH TTYCOM VARIABLE
BITMAC %TG,%TG,SV$%TG		;6-BIT BYTE TTYST1,TTYST2 GROUPS
BITMAC %TT,%TT,SV$%TT		;LH TTYTYP VARIABLE
BITMAC %PI,%PI,SV$%PI		;FULL WORD .PIRQC VARIABLE
BITMAC %PJ,%PJ,SV$%PJ		;LH .PIRQC VARIABLE
]		;END OF IF1

DEFINE INFORM R,S,T,U,V,W,X,Y,Z,$,%
PRINTX ≤	R!S!T!U!V!W!X!Y!Z!$!%
≤
TERMIN

DEFINE WARN R,S,T,U,V,W,X,Y,Z,$,%
WARN1 [R!S!T!U!V!W!X!Y!Z!$!%]
TERMIN

DEFINE WARN1 CRUFT
IFL 40-.LENGTH ≤CRUFT≤,[ .ERR ######
PRINTX ≤	###### CRUFT
≤
]
.ELSE .ERR ###### CRUFT
TERMIN


;;; MACRO FOR .FASL LOSERS WHO .INSRT THIS FILE TO USE
;;; IN PLACE OF THE "END" PSEUDO.  THIS GENERATES AN "END"
;;; AFTER PERFORMING SOME CLEANUP.  MANY SYMBOLS ARE EXPUNGED
;;; SO THAT .FASL FILES WILL NOT SPEND INFINITE TIME TRYING TO
;;; PASS THEM TO DDT.

DEFINE FASEND
IF2,[
EXPUNGE  QIO NASCII
EXPUNGE  NIL A B C AR1 AR2A NACS T TT D R F FREEAC P FLP FXP SP
EXPUNGE  LERR ACALL AJCALL LER3 ERINT PP STRT SERINT TP IOJRST UUOMAX
EXPUNGE  CALL JCALL CALLF JCALLF NCALL NJCALL NCALLF NJCALF NUUOCLS
EXPUNGE  NERINT
EXPUNGE  %UDF %UBV %WTA %UGT %WNA %GCL %FAC %IOL
EXPUNGE  %%UDF %%UBV %%WTA %%UGT %%WNA %%GCL %%FAC %%IOL
EXPUNGE  ASAR TTSAR
EXPUNGE  AS.JOB AS.FIL AS.RDT AS.OBA AS.SX AS.FX AS.FL AS.GCP
EXPUNGE  TTS.CL TTS.IM TTS.BN TTS.TY TTS.IO TTS.CN TTS.GC
EXPUNGE  TTSDIM TTS.1D TTS.2D TTS.3D TTS.4D TTS.5D
EXPUNGE  FI.EOF FO.EOF FI.BBC FI.BBF TI.BFN FT.CNS F.GC
EXPUNGE  F.MODE FBT.CM FBT.SA FBT.CP FBT.LN FBT.AP FBT.CC FBT.FR
EXPUNGE  F.CHAN F.DEV F.SNM F.PPN F.FN1 F.FN2
EXPUNGE  F.RDEV F.RSNM F.RFN1 F.RFN2 F.FPOS LOPOFA
EXPUNGE  TI.ST1 TO.TYP TI.ST2 ATO.LC
EXPUNGE  AT.CHS AT.LNN AT.PGN FO.LNL FO.PGL FB.IOT LONBFA
EXPUNGE  FB.BFL AB.CNT FB.STS AB.BP FB.NBF XB.AOB FB.WDC FB.BUF
IRPC X,,[AXI]
IRPC Y,,[DT]
IRPC Z,,[IO]
EXPUNGE  X!!Y!!Z!C.SZ  X!!Y!!Z!B.BS  X!!Y!!Z!B.SZ
TERMIN
TERMIN
TERMIN
EXPUNGE  J.INTF J.LFNM J.GC J.INTB J.STAD LOJOBA J.SYMS
IRP X,,[02,1N,12,23,2N,0,1,2,4,01,012,01234,0234,3456,1234567
13456,234,345,234567,76543]
EXPUNGE  LA!X FA!X
TERMIN
MACROLOOP NBITMACS,BTMC,*
]		;END OF IF2
END 
TERMIN

;;; USEFUL MACRO FOR .FASL FILES.  CAUSES LOADING TO PRINT MESSAGE.

DEFINE VERPRT NAME
.SXEVAL    (COND ((STATUS NOFEATURE NOLDMSG)
		  (COND ((STATUS FEATURE NEWIO)
			 (TERPRI MSGFILES)
			 (TYO #73  MSGFILES)
			 (PRINC (QUOTE LOADING/ NAME/ ) MSGFILES)
			 (DO ((N #<.FNAM2> (LSH N #6 )))
			     ((ZEROP N))
			     (TYO (PLUS #40  (LSH N #-30. ))
				  MSGFILES)))
			(T (TERPRI)
			   (TYO #73 ) 
			   (PRINC (QUOTE LOADING/ NAME/ ))
			   (DO ((N #<.FNAM2> (LSH N #6 )))
			       ((ZEROP N))
			       (TYO (PLUS #40  (LSH N #-30. ))))))))
TERMIN

SUBTTL	ONE-LINE CONDITIONAL MACROS

;;; HOPEFULLY THESE WILL HELP MAKE SOME CODE LESS MESSY TO READ.
;;; PREFACING A LINE OF CODE WITH ONE OF THESE SYMBOLS TELLS MIDAS
;;; TO ASSEMBLE THAT LINE ONLY UNDER THE SPECIFIED CONDITION.
;;; EXAMPLE:
;;;
;;;	FOO:	MOVE A,(P)
;;;	10$	PUSHJ P,10HACK		;THIS LINE IS FOR DEC-10 ONLY
;;;		MOVE A,-1(P)
;;;	NW%	PUSHJ P,OLDHAK		;THIS LINE IS FOR OLD I/O ONLY
;;;		POPJ P,


DEFINE 10$
IFN D10,TERMIN

DEFINE 10%
IFN ITS,TERMIN

DEFINE SA%
IFE SAIL,TERMIN

DEFINE SA$
IFN SAIL, TERMIN

DEFINE 10X
IFN TENEX,TERMIN

;;; EVENTUALLY, SWITCH "PAGING" AND PG$, PG% WILL BE GOOD IDEA.

;;;  FOOLISH NEW READER FLAG (HISTORICAL ARTIFACT -- FLUSH EVENTUALLY)

DEFINE NW$
IFN NEWRD,TERMIN

DEFINE NW%
IFE NEWRD,TERMIN

DEFINE Q%
IFE QIO,TERMIN

DEFINE Q$
IFN QIO,TERMIN

DEFINE BG$
IFN BIGNUM,TERMIN

DEFINE BG%
IFE BIGNUM,TERMIN

SUBTTL	FORMAT OF ARRAYS

;;; ARRAYS ARE POINTED TO BY A TWO-WORD SAR (SPECIAL ARRAY CELL).
;;; SARS RESIDE IN A SPECIAL SPACE CALLED SAR SPACE.
ASAR==0		;SAR POINTER POINTS TO ASAR (CODE DEPENDS ON THIS)
TTSAR==1	;TTSAR COMES JUST AFTER IT
;;; THE FIRST WORD OF THE SAR, CALLED THE ASAR, POINTS TO THE ARRAY
;;; HEADER; PUSHJ'ING INDIRECTLY THOUGH IT GETS TO THE ARRAY
;;; SUBSCRIPT EVALUATION CODE. THE LEFT HALF, EXCLUDING THE
;;; INDIRECT AND INDEX BITS, CONTAINS VARIOUS BITS DESCRIBING
;;; THE TYPE OF THE ARRAY:

AS.JOB==10000		;JOB ARRAY (IN QIO ONLY)
AS.FIL==4000		;FILE ARRAY (IN QIO ONLY)
AS.RDT==2000		;READTABLE
AS.OBA==1000		;OBARRAY
AS.SX==400		;S-EXPRESSION	;THESE ARE ACCESS
AS.FX==200		;FIXNUM		; METHODS - AT LEAST
AS.FL==100		;FLONUM		; ONE MUST BE ON
AS.GCP==40		;GC SHOULD USE AOBJN PTR TO MARK ARRAY

;;; THE SECOND WORD, CALLED THE TTSAR, POINTS TO THE ARRAY DATA
;;; AND IS INDEXED BY ACCUMULATOR TT. ITS LEFT HALF, EXCLUDING
;;; AGAIN THE INDIRECT AND INDEX BITS, CONTAIN MORE INFORMATION
;;; ABOUT THE ARRAY:

TTS.CL==40000		;CLOSED FILE
TTS.IM==2000		;1 => IMAGE		;BOTH 0
TTS.BN==1000		;1 => BINARY (FIXNUM)	; => ASCII
TTS.TY==400		;0 => DSK-TYPE, 1 => TTY
TTS.IO==200		;0 => IN, 1 => OUT
TTS.CN==100		;COMPILED CODE NEEDS THIS SAR
TTS.GC==40		;USED AS MARK BIT BY GC
TTSDIM==410300	;BYTE POINTER FOR # OF DIMENSIONS (1-5)
TTS.1D==100000		;DEFINITIONS
TTS.2D==200000		; FOR SPECIFYING
TTS.3D==300000		; NUMBER OF
TTS.4D==400000		; ARRAY
TTS.5D==500000		; DIMENSIONS

;;; S-EXPRESSION ARRAYS HAVE THE FOLLOWING FORM:
;;;		-<# WDS FOR GC MARK>,,<1ST WD OF DATA TO MARK>
;;;	HEADER:	JSP TT,<N>DIMS	;ASAR POINTS HERE; N=# OF DIMS
;;;		<ADDRESS OF SAR>	;LH USED BY FLASH
;;;		<DIMENSION 1>
;;;		   ...
;;;		<DIMENSION N>
;;;	DATA:	<ENTRY 0>,,<ENTRY 1>	;TTSAR POINTS HERE
;;;		   ...			;DATA PACKED 2/WD
;;;		<ENTRY X-1>,,<ENTRY X>
;;;
;;; THE FORMAT OF A NUMBER ARRAY IS AS FOLLOWS:
;;;		<GC AOBJN PTR>	;PROBABLY MEANINGLESS
;;;	HEADER:	PUSH P,CFIX1	;CFLOAT1 FOR A FLONUM ARRAY
;;;		JSP TT,<N>DIMF	;N=# OF DIMS
;;;		<ADDRESS OF SAR>	;LH USED BY FLASH
;;;		<DIMENSION 1>
;;;		   ...
;;;		<DIMENSION N>
;;;	DATA:	<ENTRY 0>	;TTSAR POINTS HERE
;;;		<ENTRY 1>	;FULL-WORD DATA 1/WD
;;;		   ...
;;;		<ENTRY X>

;;; THE AOBJN POINTER AT THE TOP OF EACH ARRAY IS MEANINGFUL ONLY
;;; IF THE AS.GCP BIT IS 1 IN THE ARRAY'S ASAR; IT INDICATES
;;; WHAT ENTRIES IN THE ARRAY GC SHOULD MARK. FOR S-EXPRESSION
;;; ARRAYS, THIS IS GENERALLY THE ENTIRE ARRAY; FOR OBARRAYS,
;;; IT INCLUDES THE BUCKETS BUT NOT THE SCO TABLE. FOR
;;; READTABLES, WHICH ARE OTHERWISE FIXNUM ARRAYS, UNDER NEWRD
;;; THE GC AOBJN POINTER INDICATES THAT THE LIST OF CHARACTER
;;; MACRO FUNCTIONS SHOULD BE MARKED.
;;; NOTE THAT IF SUCH AN AOBJN POINTER IS OF THE FORM <-N>,,<DATA>,
;;; THEN 2*N ENTRIES ARE MARKED; THE LEFT HALF IS THE NUMBER
;;; OF WORDS TO BE MARKED, WITH TWO ENTRIES PER WORD.
;;; CORRESPONDS TO ARRAY TYPE BITS IN ASAR'S.

SUBTTL	DEFINITIONS OF UUO'S

;;; NOTE: LERR < LER3 < ERINT < SERINT  -- SEE ERRFRAME.

LERR=1←33	;LISP ERROR; AC FIELD=0 => MSG IS SIXBIT, ELSE S-EXP
ACALL=2←33	;KLUDGY FAST UUO FOR NCALLS TO ARRAYS
AJCALL=3←33	;AJCALL:ACALL :: JCALL:CALL
LER3=4←33	;EPRINT, THEN LERR
ERINT=5←33	;A CORRECTABLE ERROR
PP=6←33		;SEXP TYPE OUT FROM DDT
STRT=7←33	;STRING TYPEOUT
SERINT=10←33	;LIKE ERINT, BUT S-EXPRESSION MESSAGE.
TP=11←33	;PRINTS ST ENTRY FOR A GIVEN LOCATION
IOJRST=12←33	;JRST TO ADR AFTER PUTTING I/O ERROR MSG IN C
UUOMAX==12	;NO OF ERROR-TYPE UUO'S


CALL=14←33	;BASIC CALL FROM COMPILED CODE TO INTERFACE TO INTERPRETER
JCALL=CALL+1←33	;4.1 BIT ON MEANS JRST TO FUNCTION RATHER THAN PUSHJ
CALLF=CALL+2←33	;4.2 BIT ON MEANS NEVER CONVERT UUO INTO PUSHJ [OR JRST]
JCALLF=CALL+3←33
NCALL=20←33	;4.5 BIT MEANS NUMBER FUNCTION CALL
NJCALL=NCALL+1←33
NCALLF=NCALL+2←33
NJCALF=NCALL+3←33
NUUOCLS==NJCALF←-33-CALL←-33

;;; SPECIAL INTERPRETATION OF STRT AC FIELD FOR QIO:
;;;	AC FIELD      OUTPUT TO
;;;	  0		OUTFILES IF ↑R SET; TTY IF ↑W SET
;;;	 17		MSGFILES
;;;	  X		FILE(S) IN ACCUMULATOR X

;;; ERINT AND SERINT ARE DECODED BY THEIR ACCUMULATOR FIELDS.
;;; HERE ARE SOME SYMBOLS FOR REFERENCING THEM.

NERINT==0
IRPS X,,[UDF,UBV,WTA,UGT,WNA,GCL,FAC,IOL]
	%!X=ERINT .IRPCNT,
	%%!X=SERINT .IRPCNT,
	DEFINE X CRUFT
		%!X [SIXBIT ≤CRUFT≤]
	TERMIN
	NERINT==NERINT+1
TERMIN

;;; SHORT FORM	ATOM		WHAT IS IT?
;;; 
;;; 0)  UDF	UNDEF-FNCTN	UNDEFINED FUNCTION (FUNCTION IN A)
;;; 1)  UBV	UNBND-VRBL	UNBOUND VARIABLE BEING EVAL'ED (ATOM IN A)
;;; 2)  WTA	WRNG-TYPE-ARGS	WRONG TYPE OF ARGUMENTS FOR A FUNCTION (ARG IN A)
;;; 3)  UGT	UNSEEN-GO-TAG	GO TO A TAG THAT'S NOT THERE (TAG IN A)
;;; 4)  WNA	WRNG-NO-ARGS	WRONG NUMBER OF ARGS TO A FUNCTION (FORM IN A)
;;; 5)  GCL	GC-LOSSAGE	GC LOST (A = NAME OF SPACE: LIST...)
;;; 6)  FAC	FAIL-ACT	RANDOM LOSSAGE (ARG IS UP TO CALLER)
;;; 7)  IOL	IO-LOSSAGE	;QIO ONLY ;I/O LOSSAGE

SUBTTL	FORMAT OF FILE ARRAYS

;;; FILE ARRAYS ARE ARRAYS WHICH HAVE THE AS.FIL BIT SET
;;; IN THE ASAR AND SOME EXTRA BITS IN THE TTSAR DESCRIBING
;;; THE TYPE OF ARRAY. PRESENTLY THERE EXIST SIX KINDS
;;; OF FILE ARRAY: ASCII INPUT, ASCII OUTPUT, TTY INPUT,
;;; TTY OUTPUT, BINARY INPUT, AND BINARY OUTPUT.
;;; A FILE ARRAY CONTAINS A NUMBER OF VARIABLES RELATED TO
;;; THE FILE, PLUS A BUFFER FOR DATA (EXCEPT FOR TTY).

;;; THE NAMES OF THE FILE ARRAY COMPONENTS INDICATE THE
;;; TYPES OF FILE ARRAYS TO WHICH THEY ARE APPLICABLE:
;;;	F.	ANY FILE ARRAY		AI.	ASCII INPUT ONLY
;;;	FI.	INPUT ONLY		TI.	TTY INPUT ONLY
;;;	FO.	OUTPUT ONLY		XI.	BINARY INPUT ONLY
;;;	FA.	ASCII ONLY		AO.	ASCII OUTPUT ONLY
;;;	FT.	TTY ONLY		TO.	TTY OUTPUT ONLY
;;;	FX.	BINARY ONLY		XO.	BINARY OUTPUT ONLY
;;;	AX.	ASCII/BINARY ONLY	AT.	ASCII/TTY ONLY
;;;	FB.	BLOCK MODE		FC.	CHAR (UNIT) MODE
;;;	XXB.	XX BLOCK MODE		XXC.	XX CHAR MODE

;;; NOTE: COMPONENTS MARKED (RELOC) MUST HAVE THEIR RIGHT
;;; HALVES RELOCATED WHEN THE ARRAY IS MOVED.

;;; THE FOLLOWING ARE INDICES INTO THE FILE ARRAY'S DATA AREA
;;; (I.E. THEY ARE USED TO INDEX THROUGH THE TTSAR).

	FI.EOF==0	;EOF FUNCTION
	FO.EOP==0	;END OF PAGE FUNCTION (BINARY N/A)
	FJ.INT==0	;INT FN FOR USR DEVICE

	FI.BBC==1	;BUFFERED BACK CHARS (BINARY N/A)
			;  LEFT HALF: SINGLE CHAR (3.8=1 IF ANY,
			;	SO CAN DISTINGUISH ↑@ FROM NONE)
				.SEE $DEVICE
			;  RIGHT HALF: LIST OF CHARS

	FI.BBF==2	;LIST OF BUFFERED BACK FORMS (BINARY N/A)

	TI.BFN==3	;RH IS BUFFER-FORWARD FUNCTION FOR READ

	FT.CNS==4	;ASSOCIATED TTY FILE FOR OTHER DIRECTION

;SLOTS 5, 6, AND 7 ARE RESERVED FOR EXPANSION

F.GC==10	;NUMBER OF SLOTS GC SHOULD EXAMINE

	F.MODE==10	;MODE BITS FOR OPEN
			;FOR ITS:
FBT.CM==400000		;4.9	0=BUFFERED, 1=CHARMODE
FBT.SA==200000		;4.8	SAIL CHARS (AFFECTS CHARPOS)
FBT.CP==100000		;4.7	CURSORPOS WILL SUCCEED (?);
			;	REFLECTS %TOMVU (CAN MOVE UP)
FBT.LN==40000		;4.6	HANDLE TTY IN LINE MODE
FBT.AP==20000		;4.5	OPENED IN APPEND MODE
FBT.EC==10000		;4.4	OUTPUT TTY IN ECHO AREA
FBT.FR==4000		;4.3	FORCE-FEED REQUIRED (INVERSE
			;	 OF (STATUS TTYREAD))
FBT.SE==2000		;4.2	TTY CAN SELECTIVELY ERASE
FBT.FU==1000		;4.1	TTY SHOULD READ/PRINT FULL 12.-BIT
			;	CHARACTERS (FIXNUM MODE)
FBT.SI==400		;3.9	USE SIOT FOR I/O TRANSFERS
			;	(ONLY IMPLEMENTED FOR OUTPUT NOW)
FBT.CA==40		;3.6	CLA
			;1.4-1.3 0=ASCII, 1=FIXNUM, 2=IMAGE
			;1.2	0=DSK, 1=TTY
			;1.1	0=INPUT, 1=OUTPUT

	F.CHAN==11	;I/O CHANNEL NUMBER

;;; FROM F.DEV TO F.RFN2 ARE USED BY JOB ARRAYS ALSO.

;;; MUST HAVE (F.DEV, F.SNM/F.PPN, F.FN1, F.FN2) IN THAT ORDER
	F.DEV==12	;DEVICE NAME
	F.SNM==13	;SNAME (ITS)
	F.PPN==13	;PROJ-PROG NUMBER (DEC-10)
	F.FN1==14	;FILE NAME 1
	F.FN2==15	;FILE NAME 2

	F.RDEV==16	;.RCHST'D DEVICE NAME
	F.RSNM==17	;.RCHST'D SNAME
	F.RFN1==20	;.RCHST'D FILE NAME 1
	F.RFN2==21	;.RCHST'D FILE NAME 2
	F.FPOS==22	;FILEPOS OF JUST BEYOND END OF BUFFER
			; IN WORDS (CHARS FOR SINGLE ASCII)
			;NOTE THAT AB.BP CONTAINS SOME FILEPOS
			; INFO FOR BLOCK ASCII FILES
			;-1 => NOT RANDOMLY ACCESSIBLE

LOPOFA==23	;LENGTH OF PLAIN OLD FILE ARRAY (SEE ALFILE)

;;; BEWARE: .RCHST MAY CLOBBER FOLLOWING WORD OR TWO ALSO.

	TI.ST1==23	;TTY STATUS WORD 1 (ITS)

	TI.ST2==24	;TTY STATUS WORD 2 (ITS)
	ATO.LC==24	;NORMALLY ZERO:
			; POSITIVE => LAST CHAR WAS /, NEXT
			;	MAY THEREFORE EXCEED LINEL
			; NEGATIVE => LAST CHAR WAS CR,
			;	MAY NEED TO SUPPLY AN LF

	AT.CHS==25	;CHARPOS

	AT.LNN==26	;LINENUM

	AT.PGN==27	;PAGENUM

	FO.LNL==30	;LINE LENGTH (BINARY N/A)
			;MAY BE NEGATIVE (SEE STERPRI)

	FO.PGL==31	;PAGE LENGTH (BINARY N/A)

;SLOTS 32-37 ARE RESERVED FOR EXPANSION

LONBFA==40	;LENGTH OF NON-BUFFERED FILE ARRAY

;;; EVERYTHING AFTER THIS IS ONLY FOR FILES WITH BUFFERS

	FB.BFL==40	;BUFFER LENGTH

	AB.CNT==41	;CHAR COUNT WITHIN BUFFER (ITS)
	FB.STS==41	;FILE STATUS (DEC10)

	AB.BP==42	;BYTE POINTER (RELOC) (ITS)
	XB.AOB==42	;AOBJN POINTER FOR PICKING UP WORDS (RELOC) (ITS)
	FB.NBF==42	;USE BIT, SIZE, ADR NEXT BUF (RELOC) (DEC10)

	FB.IOT==43	;.IOT POINTER TO BUFFER (RELOC) (ITS)
	FB.WDC==43	;BOOKKEEPING, WORD COUNT (DEC10)

	FB.BYT==44	;LH OF INITIAL BYTE POINTER,,BYTES PER WORD (ITS)
			;NOTE THAT @(17) BITS ARE ALWAYS ZERO

;SLOTS 45-47 ARE RESERVED FOR EXPANSION

	FB.BUF==50	;BEGINNING OF BUFFER
			;FOR TTY INPUT, THE "BUFFER" IS AN ARRAY
			; OF INTERRUPT FUNCTIONS FOR EACH CHAR

;;; FOR DEC-10 MUST USE THE DEVSIZ UUO TO GET BUFFER SIZE.
;;; THE FOLLOWING ARE THEREFORE ONLY FOR ITS.

;IRPC X,,[AXI]
;IRPC Y,,[DT]
;IRPC Z,,[IO]
ADIC.SZ==LONBFA
ADIB.BS==100			;GOOD RANDOM SIZE
ADIB.SZ==FB.BUF+ADIB.BS
ADOC.SZ==LONBFA
ADOB.BS==100			;GOOD RANDOM SIZE
ADOB.SZ==FB.BUF+ADOB.BS
ATIC.SZ==FB.BUF+NASCII/2	;ROOM FOR INTERRUPT FUNCTIONS
ATIB.BS==-1
ATIB.SZ==-1			;BLOCK MODE ILLEGAL
ATOC.SZ==LONBFA
ATOB.BS==100			;GOOD RANDOM SIZE
ATOB.SZ==FB.BUF+ATOB.BS
XDIC.SZ==LONBFA
XDIB.BS==100			;GOOD RANDOM SIZE
XDIB.SZ==FB.BUF+XDIB.BS
XDOC.SZ==LONBFA
XDOB.BS==100			;GOOD RANDOM SIZE
XDOB.SZ==FB.BUF+XDOB.BS
XTIC.SZ==FB.BUF+NASCII/2	;ROOM FOR INTERRUPT FUNCTIONS
XTIB.BS==-1
XTIB.SZ==-1			;BLOCK MODE ILLEGAL
XTOC.SZ==LONBFA
XTOB.BS==100			;GOOD RANDOM SIZE
XTOB.SZ==FB.BUF+XTOB.BS
IDIC.SZ==LONBFA
IDIB.BS==100			;GOOD RANDOM SIZE
IDIB.SZ==FB.BUF+IDIB.BS
IDOC.SZ==LONBFA
IDOB.BS==100			;GOOD RANDOM SIZE
IDOB.SZ==FB.BUF+IDOB.BS
ITIC.SZ==FB.BUF+NASCII/2	;ROOM FOR INTERRUPT FUNCTIONS
ITIB.BS==-1
ITIB.SZ==-1			;BLOCK MODE ILLEGAL
ITOC.SZ==LONBFA
ITOB.BS==100			;GOOD RANDOM SIZE
ITOB.SZ==FB.BUF+ITOB.BS
;TERMIN
;TERMIN
;TERMIN

SUBTTL	FORMAT OF JOB ARRAYS

;;; JOB ARRAYS ARE ARRAYS WHICH HAVE THE AS.JOB BIT SET
;;; IN THE ASAR.  THE TTS.CL BIT IS RELEVANT HERE ALSO,
;;; INDICATING A CLOSED JOB ARRAY.
;;; THE ARRAY CONTAINS VARIOUS DATA ASSOCIATED WITH THE JOB.

;;; NOTE: COMPONENTS MARKED (RELOC) MUST HAVE THEIR RIGHT
;;; HALVES RELOCATED WHEN THE ARRAY IS MOVED.

;;; THE FOLLOWING ARE INDICES INTO THE FILE ARRAY'S DATA AREA
;;; (I.E. THEY ARE USED TO INDEX THROUGH THE TTSAR).

	J.INTF==0	;INTERRUPT FUNCTION (NEEDED BY INT SYSTEM)
	J.CINT==1	;CHANNEL INTERRUPT FUNCTION
	J.LFNM==2	;LOAD FILE NAMELIST?

J.GC==2		;NUMBER OF SLOTS GC SHOULD EXAMINE

;SLOTS 3-12 RESERVED

;;; F.DEV THROUGH F.RFN2 (12 TO 21) APPLY TO JOB ARRAYS ALSO.

	J.INTB==22	;INTERRUPT BIT, OR ZERO FOR FOREIGN JOB
	J.STAD==23	;START ADDRESS

LOJOBA==100

	J.SYMS==100	;START OF SYMBOL TABLE, IF ANY